Use case: SMARTCARD TX DMA process

Sequence diagram

SMARTCARD transmit DMA process

  @startuml
  participant "User Application" as p1
  participant "HAL SMARTCARD driver" as p2
  participant "SMARTCARD_IRQHandler" as p5
  participant "DMA" as p3
  participant "DMAx_IRQHandler" as p4

  == initialization and configuration ==
  == Smartcard HAL Transmit DMA ==
  p1->p2: <color: green> HAL_SMARTCARD_Transmit_DMA(&hsmartcard, aTxBuffer, DATA_TO_SEND_SIZE)
  note over p2 #00FF00
  Transmitting data ongoing
  end note
  p2->p3: HAL_DMA_Start_IT()
  p3-->p2: HAL_OK
  p2-->p1: HAL_OK

  p4<-: DMAx complete interrupt
  p4->p3: HAL_DMA_IRQHandler
  note over p3 #00FF00
  End of transmitting data
  end note
  p3->p2: XferCpltCallback
  p2->p2: Enable SMARTCARD Transmit Complete IRQ (TCIE)
  p5<-: SMARTCARD Transmit Complete (TCIE)
  p5->p2: HAL_SMARTCARD_IRQHandler
  p2->p1: HAL_SMARTCARD_TxCpltCallback(hsmartcard->tx_xfer_count)
  @enduml

Code snippet

HAL1

HAL2

#define DATA_TO_SEND_SIZE  255

SMARTCARD_HandleTypeDef hsmartcard;

uint8_t aTxBuffer[DATA_TO_SEND_SIZE] = " **** Smartcard Communication **** ";


    /* Ensure that all required peripherals
      (USART, GPIO,NVIC,DMA etc.) are configured properly
    /*
    ...
    */

    /* Smartcard register Transmit complete user callback */
    HAL_SMARTCARD_RegisterCallback(&hsmartcard, HAL_SMARTCARD_TX_CB_ID,
                                   Smartcard_TxCpltCallback);

    /* Start a Smartcard Process in dma mode */
    HAL_SMARTCARD_Transmit_DMA(&hsmartcard, aTxBuffer,
                                    DATA_TO_SEND_SIZE)
#define DATA_TO_SEND_SIZE  255

hal_smartcard_handle_t hsmartcard;

uint8_t aTxBuffer[DATA_TO_SEND_SIZE] = " **** Smartcard Communication **** ";


    /* Ensure that all required peripherals
      (USART, GPIO,NVIC,DMA etc.) are configured properly
    /*
    ...
    */

    /* Smartcard register Transmit complete user callback */
    HAL_SMARTCARD_RegisterTxCpltCallback(&hsmartcard, Smartcard_TxCpltCallback);


    /* Start a Smartcard Process in dma mode */
    HAL_SMARTCARD_Transmit_DMA(&hsmartcard, aTxBuffer,
                                    DATA_TO_SEND_SIZE);

Key changes

  1. HAL2 uses a different DMA start API for peripheral transfers (HAL_DMA_StartPeriphXfer_IT_Opt).

  2. HAL2 provides a dedicated transmit-complete callback registration API (HAL_SMARTCARD_RegisterTxCpltCallback).